package com.atguigu.ssyx.search.receiver;

/**
 * @author 杨林
 * @create 2023-08-04 16:17 星期五
 * description:
 */

import com.atguigu.ssyx.common.constant.MqConst;
import com.atguigu.ssyx.search.service.SkuService;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;


/**
 * 接收mq消息
 */
@Component
public class SkuReceiver {
    
    @Autowired
    private SkuService skuService;

    /**
     * 商品上架
     * @param skuId
     * @param message
     * @param channel
     */
    /**
     *  相关注解说明：
     *      @RabbitListener：标记该方法是一个RabbitMQ的监听器。用于告诉Spring容器在指定的队列中接收消息并调用该方法进行处理
     *      bindings：这是@RabbitListener注解的属性，用于指定队列和交换机之间的绑定关系
     *      value：@QueueBinding注解的属性，用于指定队列配置
     *          @Queue：@QueueBinding注解内部的注解，用于指定队列的名称和持久性
     *              value：队列的名称
     *              durable：是否开启队列的持久性
     *          @exchange：@QueueBinding注解的另一个内部注解，用于指定交换机的配置
     *              value：交换机的名称
     *          key：绑定建，用于指定消息在交换机和队列之间的路由规则
     */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = MqConst.QUEUE_GOODS_UPPER,durable = "true"),
            exchange = @Exchange(value = MqConst.EXCHANGE_GOODS_DIRECT),
            key = {MqConst.ROUTING_GOODS_UPPER}
    ))
    public void upperSku(Long skuId, Message message, Channel channel) throws IOException {
        if (skuId != null){
            skuService.upperGoods(skuId);

            /**
             * channel.basicAck:
             *     告诉消息队列，已经成功被消费者处理并确认
             *      第一个参数：表示收到消息的标号
             *          message.getMessageProperties().getDeliveryTag()：代表消息的交付标签
             *      第二个参数：如果为true表示可以签收多个消息
             */
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        }
    }


    /**
     * 商品下架
     * @param skuId
     * @param message
     * @param channel
     */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = MqConst.QUEUE_GOODS_LOWER,durable = "true"),
            exchange = @Exchange(value = MqConst.EXCHANGE_GOODS_DIRECT),
            key = {MqConst.ROUTING_GOODS_LOWER}
    ))
    public void lowerSku(Long skuId,Message message,Channel channel) throws IOException {
        if (skuId != null){
            skuService.lowerGoods(skuId);
        }
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
    }
    
}
